package com.mqy.mybatis.utils;

/**
 * @author 13159 //作者
 * @version V1.0 //版本
 * @Project 2022.3.2MyBatis
 * @Package com.mqy.mybatis.utils
 * @Description:
 * @Date 2022/3/2 14:52//日期
 * @Motto:放下杂念,只为迎接明天更好的自己
 */

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.InputStream;

/**
 * Resource：用于获得读取配置文件的IO对象，
 * 耗费资源，建议通过IO一次性读取所有所需要的数据。
 * <p>
 * SqlSessionFactory：SqlSession工厂类，
 * 内存占用多，耗费资源，建议每个应用只创建一个对象。
 * <p>
 * SqlSession：相当于Connection，可控制事务，
 * 应为线程私有，不被多线程共享。
 * <p>
 * 将获得连接、关闭连接、提交事务、回滚事务、
 * 获得接口实现类等方法进行封装。
 */
public class MyBatisUtil {
    /*创建一个相当于map   把每次的key 来取相对应的value */
    private static ThreadLocal<SqlSession> sessionThreadLocal = new ThreadLocal<>();
    private static SqlSessionFactory sessionFactory;


    /*获取一个sqlsession*/
    private static SqlSession getSession() throws Exception {
        if (sessionFactory == null) {
            InputStream inputStream = Resources.getResourceAsStream("mybatis.xml");
            sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        }
        SqlSession sqlSession = sessionFactory.openSession();
        sessionThreadLocal.set(sqlSession);
        return sqlSession;
    }

    public static <T> T getMapper(Class<T> mapperClass) {
        //需要一个sqlsession
        SqlSession sqlSession = sessionThreadLocal.get();
        /*如果是空的就获取一个sqlsession*/
        if (sqlSession == null) {
            try {
                sqlSession=getSession();//初始化会话
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        T mapper = sqlSession.getMapper(mapperClass);
        return mapper;

    }

    public static void commit() {
        //需要一个sqlsession
        SqlSession sqlSession = sessionThreadLocal.get();
        if (sqlSession != null) {//防止直接执行这个操作,没有执行前置的操作
            sqlSession.commit();
        }
    }


        public static void rollback() {
            //需要一个sqlsession
            SqlSession sqlSession = sessionThreadLocal.get();
            if (sqlSession != null) {
                sqlSession.rollback();
            }
        }

    public static void close() {
        SqlSession sqlSession = sessionThreadLocal.get();
        if (sqlSession != null) {
            sqlSession.close();
            sessionThreadLocal.remove();//清理移除
        }
    }
}
